/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.thinkgem.jeesite.modules.sys.utils;

import org.springframework.stereotype.Component;

import com.thinkgem.jeesite.common.security.iauth.IUserSession;
import com.thinkgem.jeesite.common.security.iauth.Principal;
import com.thinkgem.jeesite.common.security.iauth.UserUtils;
import com.thinkgem.jeesite.common.utils.CacheUtils;
import com.thinkgem.jeesite.common.utils.SpringContextHolder;
import com.thinkgem.jeesite.modules.sys.dao.UserDao;
import com.thinkgem.jeesite.modules.sys.entity.User;
/**
 * @author tomZ
 *
 */
@Component
public class JWebUserSession implements IUserSession<User> {

	private static UserDao userDao = SpringContextHolder.getBean(UserDao.class);
	
	
	/**
	 * 根据ID获取用户
	 * @param id
	 * @return 取不到返回null
	 */
	public User get(String id){
		User user = (User)CacheUtils.get(UserUtils.USER_CACHE, UserUtils.USER_CACHE_ID_ + id);
		if (user ==  null){
			user = userDao.get(id);
			if (user == null){
				return null;
			}
			CacheUtils.put(UserUtils.USER_CACHE, UserUtils.USER_CACHE_ID_ + user.getId(), user);
			CacheUtils.put(UserUtils.USER_CACHE, UserUtils.USER_CACHE_LOGIN_NAME_ + user.getLoginName(), user);
		}
		return user;
	}
	
	/**
	 * 清除当前用户缓存
	 */
	public static void clearCache(){
		JWebUserSession.clearCache((User) UserUtils.getUser());
		UserUtils.removeCache(UserUtils.CACHE_AUTH_INFO);
	}
	
	/**
	 * 清除指定用户缓存
	 * @param user
	 */
	public static void clearCache(User user){
		CacheUtils.remove(UserUtils.USER_CACHE, UserUtils.USER_CACHE_ID_ + user.getId());
		CacheUtils.remove(UserUtils.USER_CACHE, UserUtils.USER_CACHE_LOGIN_NAME_ + user.getLoginName());
		CacheUtils.remove(UserUtils.USER_CACHE, UserUtils.USER_CACHE_LOGIN_NAME_ + user.getOldLoginName());
	}
	
	/**
	 * 获取当前用户
	 * @return 取不到返回 new User()
	 */
	public User getUser(){
		Principal principal = UserUtils.getPrincipal();
		if (principal!=null){
			User user = get(principal.getId());
			if (user != null){
				return user;
			}
			return new User();
		}
		// 如果没有登录，则返回实例化空的User对象。
		return new User();
	}

	/**
	 * 根据登录名获取用户
	 * @param loginName
	 * @return 取不到返回null
	 */
	public User getByLoginName(String loginName){
		User user = (User)CacheUtils.get(UserUtils.USER_CACHE, UserUtils.USER_CACHE_LOGIN_NAME_ + loginName);
		if (user == null){
			user = userDao.getByLoginName(new User(null, loginName));
			if (user == null){
				return null;
			}
			CacheUtils.put(UserUtils.USER_CACHE, UserUtils.USER_CACHE_ID_ + user.getId(), user);
			CacheUtils.put(UserUtils.USER_CACHE, UserUtils.USER_CACHE_LOGIN_NAME_ + user.getLoginName(), user);
		}
		return user;
	}
	
}
